(function () {
  // 定义一个表示人的类
  class Person {
    /*
            ts可以在属性前添加属性的修饰符
                - public 公共的，修饰的属性可以在任意位置修改与访问
                - private 私有的，修饰的属性只能在类里面访问与修改
                    - 通过在类中添加方法使得私有属性可以被外部访问
                - protected 受保护的，只能在当前类和子类中访问   
        */
    // public name: string;
    // private age: number;
    // protected sex: string;

    // constructor(name: string, age: number, sex: string) {
    //   this.name = name;
    //   this.age = age;
    //   this.sex = sex;
    // }

    // 其实上面的代码可以简写为这样，短短四行代码就取代了上面的声明属性再到constructor里的初始化赋值
    constructor(
      public name: string,
      private age: number,
      protected sex: string
    ) {}

    // 定义方法，可以获取到私有的age属性
    getAge() {
      return this.age;
    }
    // 定义方法，可以修改私有的age属性
    setAge(age: number) {
      // 也许你会有疑问，我们给age属性设置private的目的就是让外部不能直接赋值或者读取，你搞个setAge()方法出来，那不还是能在外部直接赋值吗？确实是这样，但是这样做的好处就在于，决定权在我们，如果我们不提供这个方法，外部就不能直接赋值了。而且我们在这个方法里可以对于赋值这个操作进行检测，比如这里的age，我们可以做一个检测，如果发现值小于0，则不进行赋值操作
      if (age <= 0) return;
      this.age = age;
    }
  }

  const person = new Person("swk", 18, "男");
  person.setAge(-1);
  person.setAge(111);
  console.log(person);

  /*
        现在属性是在对象中设置的，属性可以任意的被修改
            - 属性可以任意被修改将会导致对象中的数据变得非常不安全
    */
  person.name = "猪八戒";
})();
